Register each strategy implementation as a provider, then expose them as a map or array via a factory provider. Inject the map or array into the orchestrating service and select the right strategy at runtime based on a key or condition.
Open/closed principle — add a new strategy by registering a new provider; no changes to PaymentService.
All strategies are singleton instances managed by NestJS — no manual instantiation.
Strategies can inject other NestJS providers (config, repositories, HTTP clients) normally.
Easy to test — mock the PAYMENT_STRATEGIES token with a test map.